// ------------------------------UI界面------------------------------- //
"ui";
const Utils = require('./utils.js');
importClass(android.view.View);
activity.getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
ui.layout(
    <vertical marginTop="{{Math.max(Utils.getStatusBarHeight(), 100)}}px">
        <card w="*" h="auto" margin="10 5" cardCornerRadius="2dp" cardElevation="1dp">
            <vertical padding="18 8" h="auto">
                <Switch id="autoService" text="无障碍服务" checked="{{auto.service != null}}" w="*" textStyle="bold" gravity="right|center_vertical" />
                <Switch id="floatyPermission" text="悬浮窗权限" checked="{{floaty.checkPermission()}}" w="*" textStyle="bold" gravity="right|center_vertical" />
                <input w="*" id="code" inputType="number" gravity="right|center_vertical" hint="输入操作授权码" />
                <horizontal w="*" h="auto">
                    <text textColor="black" textStyle="bold" >输入操作间隔时间(毫秒,1000毫秒=1秒)</text>
                    <input w="*" id="runInterval" inputType="number" gravity="right|center_vertical" text="1000" />
                </horizontal>
                <horizontal w="*" h="auto">
                    <text textColor="black" textStyle="bold" >查找控件等待超时(毫秒,1000毫秒=1秒)</text>
                    <input w="*" id="overTime" inputType="number" gravity="right|center_vertical" text="5000" />
                </horizontal>
                <button id='autoFullClaim' text="开始自动认领" />
                <button id='autoSimpleClaim' text="开始自动认领(需已进入认领页面，直接执行刷新操作)" />
                <button id='autoRobSea' text="开始自动抢海" />
            </vertical>
        </card>
    </vertical>
);
// 本地存储
var sp = storages.create("sp");
ui.runInterval.setText(sp.get('runInterval', 1000) + '');
ui.overTime.setText(sp.get('overTime', 5000) + '');

// 用户勾选无障碍服务的选项时，跳转到页面让用户去开启
ui.autoService.on("check", function (checked) {
    if (checked && auto.service == null) {
        app.startActivity({
            action: "android.settings.ACCESSIBILITY_SETTINGS"
        });
    }
});
// 用户勾选悬浮窗选项时，跳转到页面让用户去开启
ui.floatyPermission.on("check", function (checked) {
    if (checked && !floaty.checkPermission()) {
        floaty.requestPermission();
    }
});
// 当用户回到本界面时，同步开关的状态
ui.emitter.on("resume", function () {
    ui.autoService.checked = auto.service != null;
    ui.floatyPermission.checked = floaty.checkPermission();
});
// ------------------------------UI界面------------------------------- //

// ------------------------------uniCloud网络数据请求------------------------------- //

// uniCloud域名链接
var baseUrl = "https://fc-mp-ef00ef1e-dd5f-4d11-908b-a4dc9999cfed.next.bspapp.com";
// 输入的授权码
var inputCode = null;
// 操作成功统计累计次数
var accumulatedCount = -1;
// 用户授权获得可操作总次数
var totalCount = 0;

/**
 * 获取用户操作成功统计累计次数
 */
function getAccumulatedCount(success) {
    inputCode = ui.code.text();
    if (inputCode == null || inputCode == '') {
        toast('请输入操作授权码');
        Utils.showLogInfo('请输入操作授权码');
    } else {
        http.get(baseUrl + '/getAccumulatedCount?code=' + inputCode, {}, function (res, err) {
            if (err) {
                Utils.showLogInfo('获取累计次数失败 ' + err, true);
            } else {
                Utils.showLogInfo('获取累计次数成功', true);
                let count = parseInt(res.body.string());
                if (count != null && count >= 0) {
                    accumulatedCount = count;
                    success();
                } else {
                    toast('获取累计次数失败，请检查授权码输入是否正确');
                    Utils.showLogInfo('获取累计次数失败，请检查授权码输入是否正确', true);
                }
            }
        });
    }
}

/**
 * 增加操作成功统计累计次数
 */
function incAccumulatedCount(retry) {
    if (retry == null || retry) {
        http.get(baseUrl + '/incAccumulatedCount?code=' + inputCode, {}, function (res, err) {
            if (err) {
                Utils.showLogInfo('追加累计成功次数失败 ' + err, true);
                if (retry == null) {
                    Utils.showLogInfo('重试追加累计成功次数', true);
                    incAccumulatedCount(true);
                }
            } else {
                let count = parseInt(res.body.string());
                if (count != null && count >= 0) {
                    accumulatedCount = count;
                    Utils.showLogInfo('成功追加累计次数', true);
                } else {
                    Utils.showLogInfo('重试追加累计成功次数', true);
                    incAccumulatedCount(true);
                }
            }
        });
    }
}
// ------------------------------uniCloud网络数据请求------------------------------- //

// 是否为自动认领模式
var isAutoClaimMode = false;
// 是否为自动抢海模式
var isAutoRobSeaMode = false;

// 点击开始全流程自动认领按钮操作
ui.autoFullClaim.click(() => {
    isAutoRobSeaMode = false;
    startOpenShop(() => {
        Utils.findClickText('全部门店', (success) => {
            if (success) {
                Utils.waitRunInterval('等待门店列表加载', 3000);
                Utils.findClickText('距离最近', (success) => {
                    if (success) {
                        Utils.findClickText('最新创建', (success1) => {
                            isAutoClaimMode = true;
                            Utils.waitRunInterval('等待门店列表加载', 3000);
                            startAutoClaim(false);
                        });
                    } else {
                        Utils.exitApp(() => {
                            isAutoClaimMode = false;
                            isAutoRobSeaMode = false;
                        }, '最新创建切换失败，退出脚本运行!');
                    }
                });
            } else {
                Utils.exitApp(() => {
                    isAutoClaimMode = false;
                    isAutoRobSeaMode = false;
                }, '关注门店切换失败，退出脚本运行!');
            }
        });
    });
});
// 点击开始刷新步骤自动认领按钮操作
ui.autoSimpleClaim.click(() => {
    isAutoRobSeaMode = false;
    Utils.startRunThread(() => {
        // 显示顶部提示
        Utils.showTopTips();
        // 开启控制台显示
        Utils.startShowConsole();
        // 开启前台保活服务
        Utils.startKeepAliveService();
        // 启动海鸥
        if (app.launch('com.meituan.sankuai.seagull')) {
            isAutoClaimMode = true;
            Utils.waitRunInterval('启动海鸥，等待工作台界面加载', 1000, true);
            startAutoClaim(true);
        } else {
            Utils.exitApp(() => {
                isAutoClaimMode = false;
                isAutoRobSeaMode = false;
            }, '海鸥启动失败，退出脚本运行!');
        }
    });
});
// 点击开始自动抢海按钮操作
ui.autoRobSea.click(() => {
    isAutoClaimMode = false;
    startOpenShop(() => {
        Utils.findClickText('关注门店', (success) => {
            // 定时时间到了再点击抢海模式
            isAutoRobSeaMode = true;
            Utils.showLogInfo('启动定时等待操作');
        });
    });
});

/**
 * 每秒执行任务
 */
Utils.secondTimerTask = function () {
    Utils.setTopTipsText(Utils.runTimeStr + " 当前成功" + accumulatedCount + "次");
    // 自动抢海模式
    if (isAutoRobSeaMode) {
        let date = new Date();
        if (date.getHours() < 21 && date.getMinutes() <= 58) {
            let hourText = date.getHours() >= 10 ? date.getHours() : ("0" + date.getHours());
            let minText = date.getMinutes() >= 10 ? date.getMinutes() : ("0" + date.getMinutes());
            let secText = date.getSeconds() >= 10 ? date.getSeconds() : ("0" + date.getSeconds());
            Utils.setTopTipsText("定时20:58:00开始执行任务，当前时间 " + hourText + ":" + minText + ":" + secText);
        } else if (date.getHours() == 20 && date.getMinutes() == 58 && date.getSeconds() == 0) {
            Utils.showLogInfo("提前进入加载抢海页面数据", true);
            startAutoRobSea(false);
        } else if (date.getHours() == 21 && date.getMinutes() == 0 && date.getSeconds() == 0) {
            Utils.showLogInfo("准点开始执行抢海操作", true);
            startAutoRobSea(true);
        }
    }
};

/**
 * 启动并打开门店，先判断各种权限获取情况
 */
function startOpenShop(callback) {
    let inputRunInterval = parseInt(ui.runInterval.text());
    if (inputRunInterval > 0) {
        Utils.runInterval = inputRunInterval;
        sp.put("runInterval", inputRunInterval);
    }
    let inputOverTime = parseInt(ui.overTime.text());
    if (inputOverTime > 0) {
        Utils.overTime = inputOverTime;
        sp.put("overTime", inputOverTime);
    }
    Utils.startRunThread(() => {
        // 显示顶部提示
        Utils.showTopTips();
        // 开启控制台显示
        Utils.startShowConsole();
        // 开启前台保活服务
        Utils.startKeepAliveService();
        // 启动海鸥
        Utils.waitRunInterval('启动海鸥', 1000, true);
        if (app.launch('com.meituan.sankuai.seagull')) {
            Utils.waitRunInterval('点击工作台', 3000);
            Utils.findClickText('工作台', (success) => {
                if (success) {
                    Utils.waitRunInterval('等待工作台界面加载', 1000);
                    callback();
                } else {
                    Utils.exitApp(() => {
                        isAutoClaimMode = false;
                        isAutoRobSeaMode = false;
                    }, '工作台切换失败，退出脚本运行!');
                }
            });
        } else {
            Utils.exitApp(() => {
                isAutoClaimMode = false;
                isAutoRobSeaMode = false;
            }, '海鸥启动失败，退出脚本运行!');
        }
    });
};

var lastClaimShopCountStr = null;
var lastClaimShopName = null;

/**
 * 开始自动认领
 * @param {boolean} clickRefresh 是否点击刷新按钮
 */
function startAutoClaim(clickRefresh) {
    if (clickRefresh) {
        Utils.clickTargetWidget(className("TextView").clickable(true).depth(15).findOnce(), (success) => {
            if (success) {
                Utils.waitRunInterval('等待门店列表加载');
                startAutoClaim(false);
            } else {
                Utils.waitRunInterval('重新刷新!');
                startAutoClaim(true);
            }
        }, '刷新按钮');
    } else {
        let shopCountStr = null;
        let shopCountWidget = textStartsWith('门店总数').findOnce();
        if (shopCountWidget != null) shopCountStr = shopCountWidget.text();
        if (shopCountStr == null || shopCountStr == '门店总数: 0') {
            startAutoClaim(false);
            return;
        }
        if (shopCountStr !== lastClaimShopCountStr) {
            lastClaimShopCountStr = shopCountStr;
            Utils.waitFindText('未签约', (textStr, widget) => {
                if (widget == null) {
                    Utils.showLogInfo('第一条数据获取失败，重新刷新!', true);
                    startAutoClaim(true);
                } else {
                    let target = widget;
                    if (target.parent() != null) target = target.parent();
                    if (lastClaimShopName != null && lastClaimShopName != '' && target.findByText(lastClaimShopName)) {
                        Utils.showLogInfo(lastClaimShopName + '已经操作过，重新刷新!');
                        startAutoClaim(true);
                    } else {
                        Utils.findClickText(target.findOne(text('收银公海')), (success) => {
                            if (success) {
                                Utils.clickTargetWidget(widget, (success1) => {
                                    if (success1) {
                                        lastClaimShopName = className("TextView").depth(20).findOnce().text();
                                        Utils.findClickText('认领', (success2) => {
                                            if (success2) {
                                                Utils.findClickText('确定', (success3) => {
                                                    if (success3) {
                                                        autoClaimSuccess(Date.now());
                                                    } else {
                                                        Utils.showLogInfo('<' + lastClaimShopName + '>门店认领失败! 执行返回', true);
                                                        if (back()) startAutoClaim(true);
                                                    }
                                                });
                                            } else {
                                                Utils.showLogInfo('<' + lastClaimShopName + '>门店认领失败! 执行返回', true);
                                                if (back()) startAutoClaim(true);
                                            }
                                        });
                                    } else {
                                        Utils.showLogInfo('点击失败，重新点击!');
                                        startAutoClaim(false);
                                    }
                                }, '第一条收银公海');
                            } else {
                                Utils.showLogInfo('不符合收银公海，重新刷新!');
                                startAutoClaim(true);
                            }
                        }, false, '第一条收银公海');
                    }
                }
            });
        } else {
            Utils.waitRunInterval('未新增门店，重新刷新');
            startAutoClaim(true);
        }
    }
};

/**
 * 自动认领成功，上报数据到后台
 * @param {number} timestamp 
 */
function autoClaimSuccess(timestamp) {
    if (Date.now() - timestamp < 2000) {
        let widget = textStartsWith('认领成功，剩余').findOnce();
        if (widget != null) {
            Utils.showLogInfo(widget.text(), true);
            incAccumulatedCount();
            if (back()) startAutoClaim(true);
        } else {
            autoClaimSuccess(timestamp);
        }
    } else {
        Utils.showLogInfo('<' + lastClaimShopName + '>门店认领操作完成! 执行返回', true);
        if (back()) startAutoClaim(true);
    }
}

// 记录自动抢海控件列表
var autoRobSeaList;

/**
 * 开始自动抢海
 * @param {boolean} startRob 是否整点正式开始抢海
 */
function startAutoRobSea(startRob) {
    if (startRob) {
        if (autoRobSeaList != null && autoRobSeaList.length > 0) {
            for (var i = 0; i < autoRobSeaList.length; i++) {
                autoRobSeaList[i].click();
                // 每点击了一个认领按钮后随机延迟100~300毫秒
                let sleepTime = random(100, 300);
                Utils.waitRunInterval('点击下一个认领按钮', sleepTime);
            }
        } else {
            Utils.exitApp(() => {
                isAutoClaimMode = false;
                isAutoRobSeaMode = false;
            }, '抢海列表数据获取失败，退出脚本运行!');
        }
    } else {
        Utils.findClickText('抢海模式', (success) => {
            if (success) {
                Utils.waitRunInterval('等待抢海界面加载', 3000);
                let retryScrollCount = 0;
                let totalScrollCount = 3;
                while (scrollUp() || retryScrollCount < totalScrollCount) {
                    retryScrollCount = retryScrollCount + 1;
                    waitRunInterval('获取列表数据，次数:' + retryScrollCount + '/' + totalScrollCount, 3000);
                }
                Utils.waitRunInterval('回滚顶部获取所有认领控件');
                if (scrollDown()) {
                    autoRobSeaList = text('认领').find();
                    if (autoRobSeaList == null || autoRobSeaList.length <= 0) {
                        Utils.exitApp(() => {
                            isAutoClaimMode = false;
                            isAutoRobSeaMode = false;
                        }, '抢海列表数据获取失败，退出脚本运行!');
                    }
                }
            } else {
                Utils.exitApp(() => {
                    isAutoClaimMode = false;
                    isAutoRobSeaMode = false;
                }, '抢海模式切换失败，退出脚本运行!');
            }
        });
    }
};